package com.dzu.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 * 使用Rabbitmq：
 * 1、引入amqp场景:RabbitAutoConfiguration  就会自动生效
 * 2、给容器中自动配置了： CachingConnectionFactory、RabbitTemplate、AmqpAdmin、RabbitMessagingTemplate
 *      所有的属性:
 *      @ConfigurationProperties(prefix = "spring.rabbitmq")
 *       public class RabbitProperties {
 * 3、配置文件中配置： spring，rabbit
 * 4、开启 ：EnableRabbit
 *
 * 5、 监听消息 使用：@RabbitListener，必须开启EnableRabbit
 * 6、RabbitListener 和 RabbitHandler
 *   RabbitListener: 标注在类上（监听那些队列即可）
 *   RabbitHandler: 标注在方法上（重载区分不同的消息），可以标注多个方法，根据重载的方法参数不同，将消息交给哪个方法处理
 *
 *
 * 本地事务失效问题
 *  同一个对象内事务方法的互相调用默认失效，原因  绕过了代理对象。而事务是通过代理对象来控制的
 *  解决：使用代理对象来调用事务方法
 *      1、引入aop-starter，它引入了aspectj，更强大  （（（（ 默认就是，不引入也可以。而且spring使用三层缓存解决了循环依赖
 *
 * Seata控制分布式事务、
 *   1、每一个微服务必须先创建一个undo_log
 *   2、安装事务协调器，seata-server ：  从 https://github.com/seata/seata/releases,下载服务器软件包，将其解压缩。
 *   3、整合
 *      1、导入依赖              <artifactId>spring-cloud-starter-alibaba-seata</artifactId>    seata-all-0.7.1
 *      2、解压并启动、seata-server：
 *          registry。conf：注册中心配置，修改registry type = nacos
 *          file。conf
 *      3、所有想要用到的分布式事务的微服务 使用 seata  DataSourceProxy代理自己的数据源
 *      4、每个微服务，都必须导入
 *             registry，conf
 *             file.conf
 *      5、给分布式大事务入口标注@GlobalTransactional
 *      6、每一个远程的小事务用@Transactional
 *
*/
//@EnableAspectJAutoProxy(exposeProxy = true)
@EnableRedisHttpSession
@EnableRabbit
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
